/**
 * @description Rsd.cqrs.Form服务介于数据通讯层和UI交互层中间
 * @description 使用schema内嵌服务，处理 单表 的数据，单个对象CURD操作 ,不负责处理页面状态及页面交互
 */
Rsd.define('Rsd.cqrs.Form', {
    extend: 'Rsd.common.Object',
    requires: ['Rsd.data.Service'],
    xtype: 'cqrs-form',

    /**
     * 该对象所属页面
     */
    owner: null,
    /**
    * */
    constructor: function Form(config) {
        config = config || {};
        this.apply(config);

    },
    /**
     * @description 获取Schema，并初始化控件 
     * @param {*} form Rsd.widget.ModelForm 对象
     * @param {*} callback 
     * @returns 
     */
    getSchema: function getSchema(callback) {
        var me = this;

        if (me.modelSchema) {
            if (callback) {
                callback(modelSchema);
            }
            return;
        }
        //
        if (me.owner.modelSchema) {
            me.modelSchema = me.owner.modelSchema;
            if (callback) {
                callback(me.modelSchema);
            }
            return;
        }

        if (Rsd.isEmpty(me.owner.modelType)) {
            
            console.error("获取Schema失败(CQRS)\r\页面(" + (me.owner.$$className||'') + ")modelType属性为空。");

            if (callback) {
                callback(null);
            }
            return;
        }
        //
        Rsd.app.getSchema(me.owner.modelType, function (modelSchema) {
            if (modelSchema) {
                me.modelSchema = modelSchema;
            }
            else {
                console.error('未找到类型：' + me.owner.modelType + '的Schema对象');
                return;
            }
            if (callback) {
                callback(modelSchema);
            }
        });
        return;
        
    },
    /**
     * @description 【数据流方向:向下】从接口获取数据，并加载到控件  
     */
    get: function get(callback) {
        var me = this;
        var _view = me.owner;
 
        if (Rsd.isEmpty(_view.key)) {
            console.log('not load data ,the page  ' + _view.id +' key is null. ');
            return;
        }
        if (Rsd.isEmpty(me.modelSchema)) {
             
            me.getSchema(function (modelSchema) {
                if(modelSchema)
                {
                    me.get(callback);
                }
                else
                {
                    Rsd.alert("获取数据失败(CQRS)\r\nSchema属性为空。");
                } 
            });
            return;
        }
        var _key = _view.key;
        //获取对象
        me.modelSchema.findObject(_key, function (resp) {
            if (callback) {
                callback(resp);
            }
        });
    },
    /**
     * @description 【数据流方向:向上】从控件获取数据，并提交接口保存 
     * @param {*} callback 
     * @returns 
     */
    save: function save(callback) {
        var me = this;
        var _view = me.owner;
         
        if (Rsd.isEmpty(me.modelSchema)) {
            
            me.getSchema(function (modelSchema) {
                if(modelSchema)
                {
                    me.save(callback);
                }
                else
                {
                    Rsd.alert("保存数据失败(CQRS)\r\nSchema属性为空。");
                }
                
            });
            return;
        }

        if (me.modelSchema instanceof Rsd.data.ModelSchema) {
        }
        else {
            console.log(me.modelSchema);
            Rsd.alert("保存数据失败(CQRS)\r\nSchema错误(不是有效的Rsd.data.ModelSchema对象)。");
            return;
        }
        if (Rsd.isEmpty(me.modelSchema.keys)) {
            Rsd.msg("主键不存在，无法执行保存。");
            return;
        }
        var _record = _view.getData();

        if (_record == null) {
            Rsd.msg("数据错误，无法保存。");
            return;
        }

        //根据主键值是否存在 判断是插入或 修改 操作
        var _keyName = me.modelSchema.keys[0];
        if (Rsd.isEmpty(_record[_keyName])) {
            //插入
            me.modelSchema.insertObject(_record, function (resp) {

                if (resp.success) {

                    _record[_keyName] = resp.data[_keyName];

                    if (callback) {
                        callback(resp);
                    }

                    _view.close();

                    Rsd.showPopup("新增数据保存成功。");
                    return false;
                }

                return true;
            });

            return;
        }
        //修改
        me.modelSchema.updateObject(_record, function (resp) {
            if (resp.success) {
                if (callback) {
                    callback(resp);
                }
                _view.close();
                Rsd.showPopup("修改数据保存成功。");
                return false;
            }
            return true;
        });

        return;
    },
    /**
     * @description 【数据流方向:向上】从控件获取数据，并提交接口修改数据 
     * @param {*} dataIndex 字段名称
     * @param {*} value 值 
     * @param {*} callback 
     */
    update:function update(dataIndex,value,callback){

        var me = this;
        if (Rsd.isEmpty(me.modelSchema)) {
            
            me.getSchema(function (modelSchema) {
                if(modelSchema)
                {
                    me.delete(callback);
                }
                else
                { 
                    Rsd.alert("修改数据失败(CQRS)\r\nSchema属性为空。");
                }
                
            });
            return;
        }
 
        if (me.modelSchema instanceof Rsd.data.ModelSchema) {
        }
        else {
            console.log(me.modelSchema);
            Rsd.alert("修改数据失败(CQRS)\r\nSchema错误(不是有效的Rsd.data.ModelSchema对象)。");
            return;
        }

        if (Rsd.isEmpty(me.modelSchema.keys)) {
            Rsd.msg("主键不存在，无法执行修改。");
            return;
        }
        var _keyName = me.modelSchema.keys[0];
        var _view = me.owner;
        var _record = _view.getData();
         if (Rsd.isEmpty(_record[_keyName]))
         {
            Rsd.msg("数据错误，无法修改。");
            return;
         }
        var data = {};
        data[_keyName] = _record[_keyName];
        data[dataIndex] = value;
        me.modelSchema.updateObject(data, function (resp) {
            if (resp.success) {
                if (callback) {
                    callback(resp);
                }
                _view.close();
                Rsd.showPopup("修改数据保存成功。");
                return false;
            }
            return true;
        });
    },
    /**
     * @description 【数据流方向:向上】提交接口删除对象，并从控件中删除对象
     * @param {*} view 
     * @param {*} form 
     */
    "delete": function _delete(callback) {
        var me = this;

         if (Rsd.isEmpty(me.modelSchema)) {
            
            me.getSchema(function (modelSchema) {
                if(modelSchema)
                {
                    me.delete(callback);
                }
                else
                { 
                    Rsd.alert("删除数据失败(CQRS)\r\nSchema属性为空。");
                }
                
            });
            return;
        }

  
        if (me.modelSchema instanceof Rsd.data.ModelSchema) {
        }
        else {
            console.log(me.modelSchema);
            Rsd.alert("删除数据失败(CQRS)\r\nSchema错误(不是有效的Rsd.data.ModelSchema对象)。");
            return;
        }

        if (Rsd.isEmpty(me.modelSchema.keys)) {
            Rsd.msg("主键不存在，无法执行删除。");
            return;
        }

        var _row = _view.getData();
        //根据主键值是否存在 判断是否已保存
        if (!Rsd.isEmpty(_row[me.modelSchema.keys[0]])) {

            me.modelSchema.deleteObject(_row, function (resp) {

                if (resp.success) {
                    if (callback) {
                        callback(resp);
                    }
                    me.close();
                    Rsd.showPopup("删除成功。");

                    return false;
                }
                return true;
            });

            return;
        }

        //尚未保存，不需要请求远端
        if (callback) {
            callback();
        }

        return;
    }

});